Date :................................ 20 septembre 1992
Programme : ......................SEVEN COLORS
Protection : ..........................MOT DE PASSE
Outils : ................................SOFT-ICE V2.50
Temps passé : ...........................15 MINUTES
Fichier : ...................................TATOU.COM
Société : ..............................INFOGRAMME
Divers :...Compacté par un compacteur maison.
Origine :................................................... B.Y.
Numéro : ..................................................184
		

	Ayant recraché le hard j'ai perdu ce DEP en même temps que celui de
	SUPERTETRIS ( recracké depuis ).
	J'ai retrouvé ce DEP par l'intermédiaire d'un de mes coress ( notemment
	Mr B.Y ) je l'ai donc "raccroché" à la fin de ce fichier.

	Ce produit comme tous les TATOU est crypté sans utiliser LZ91 ou
	PKLITE. Ceci signifie qu'une seule solution ( la plus rapide ) est
	à employer: le détournement de l'int 1C ou l'int hard du clavier ( 9 ).
	Voici donc rapidement comment y arriver:
	A l'endroit de la demande du code, la touche ESPACE permet d'arriver
	à CS:B208 et de continuer.

	CS=1027
	CS:B206	7403	JZ	B20B	; Si barre d'espace on continue par
	CS:B208	E90300	JMP	B20E	; B20E sinon on revient par B0B8.
	CS:B20B E9AAFE	JMP	B0B8
	CS:B20E ......  suite             
	
	On arrive plus loin à quelque chose qui frappe l'oeil:
	On place 0 dans AX dans un cas et 1 dans un autre. En faisant un
	essai on s'aperçoit que la bonne réponse passe par B27A qui mettra
	0000 dans AX puis des POPs et REFT. Il suffit donc d'annuler le test
	en B278 par une inversion, un autre saut direct, ou plus simplement
	des NOPs.

	CS:B278	7503	JNZ	B27D	; Saut à annuler par des 9090.
	CS:B27A E91E00	JMP	B29B	; C'est ici qu'il faut aller si OK.
	CS:B27D ......  Mauvaise réponse.
	  :
	  :
	CS:B295 B80100	MOV	AX,0001
	CS:B298	E90600	JMP	B2A1
	CS:B29B B80000	MOV	AX,0000
	CS:B29E	E90000	JMP	B2A1
	CS:B2A1	5F	POP	DI
	  :
	  :
	CS:             RETF

	Ci-dessous le lançeur TATOU.COM qui remnplace 7503 par 9090 en CS:B278.
;       PATCH POUR LE PROGRAMME SEVEN COLORS DE INFOGRAMME
;       DETOURNEMENT DE L'INT 1C
;
;******************************************************************************
;                             ZONE A INITIALISER

adr_ip1         equ     0b278h  ; adresse dont le contenu est à modifier.
anc_val         equ     0375h   ; Valeur d'origine à rechercher, inversée.
nouv_val        equ     9090h   ; Nouvelle valeur,inversée. 
INT_DET         equ     1Ch     ; Le numéro de l'INT que l'on veut utiliser.
BEEP_TONE       equ     440     ; Fréquence de la note.

;******************************************************************************
seg_a           segment byte public

		assume  cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
  
		org     100h

sto             proc    far

start:
		jmp     init            ; réduire la mémoire et déplacer la 
		db      90h             ; pile plus près.
paramet         dw      0               ; Même bloc d'environnement.            
ENVIR           dw      0               ; Les paramètres de la ligne de 
data_3          dw      0               ; commande sont recopiés ici puis
FCB_1           dw      0               ; transmis au programme fils. ( 80h )
data_5          dw      0               
FCB_2           dw      0
data_7          dw      0
sauve_SP        dw      0
sauve_SS        dw      0
data_9          dw      0, 0
drap            equ     0

;------------------------------ PROGRAMME PERE ------------------------------

loc_1:          mov     sauve_SP,sp
		mov     sauve_SS,ss
		mov     ax,80h
		mov     ENVIR,ax        ; Ligne de commande...
		mov     data_3,ds
		mov     ax,5Ch          ; Premier FCB ( inutilisé )
		mov     FCB_1,ax
		mov     data_5,ds
		mov     ax,6Ch          ; Second FCB ( inutilisé )
		mov     FCB_2,ax
		mov     data_7,ds
		mov     ah,35h  
		mov     al,INT_DET
		int     21h             ; DOS Services  ah=function 35h
					;  get intrpt vector al in es:bx
		mov     cs:data_9,bx
		mov     word ptr cs:data_9+2,es
		mov     ah,25h          
		mov     al,INT_DET              
		lea     dx,cs:[_int]    ; Load effective addr
		int     21h             ; DOS Services  ah=function 25h
					;  set intrpt vector al to ds:dx
		lea     dx,cs:[nom_prg] ; Load effective addr
		push    ds
		pop     es
		lea     bx,cs:[paramet] ; Load effective addr
		mov     al,0
		mov     ah,4Bh          
		int     21h             ; Appel du programme fils.
					; run progm @ds:dx, parm @es:bx
		mov     sp,sauve_SP     
		mov     ss,sauve_SS     
		cmp     al,2            ; teste le code de retour du programme
		jnz     ok              ; fils, 02 si pas trouvé.
		mov     dx,offset mess_err      
		mov     ah,9
		int     21h

	; Les cinq instructions suivantes sont facultatives puisque le
	; vecteur d'origine est remis en place dès que le patch est effectué.
	; Le seul but est d'éviter le plantage du PC dans l'hypothèse o— l'on
	; lance le programme père et que celui-ci ne trouve pas le programme
	; fils. A ce moment là on remet tout en place et on quitte.

ok:             mov     ah,25h
		mov     al,INT_DET
		mov     dx,cs:data_9
		mov     ds,word ptr cs:data_9+2
		int     21h             

		mov     ah,4Ch
		int     21h             ;  terminate with al=return code
sto             endp

;---------------------------- int détournée --------------------------------

int_entry       proc    far
_int:           jmp     apres
_SAUVE_SP	dw      0,0
apres:	        push    ax
		push    ds
		push    bx
		push    cx
		push    dx
		pushf                           ; Push flags
		mov     dx,305h
		in      al,dx
		mov     word ptr cs:[_SAUVE_SP],sp
		mov     cx,30
prochain:       pop     ds
		dec     cx
		jz      s                      
		cmp     word ptr ds:[adr_ip1],anc_val   ; Si ok on patche.
		jnz     prochain
		mov     word ptr ds:[adr_ip1],nouv_val  ; On y place le patch.
		xor     bx,bx
		mov     ds,bx                   

	; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de
	; la fonction 25h ( set int. vector )   
	
		mov     bx,word ptr cs:data_9      ; Je remets manuellement
		mov     ds:[INT_DET*4],bx          ; en place le vecteur
		mov     bx,word ptr cs:data_9+2    ; de l'INT détournée.
		mov     ds:[INT_DET*4+2],bx        
		mov     dx,304h 
		in      al,dx
;* Sound - Sounds speaker with the following tone and duration:

	mov     al, 0B6h                ; Initialize channel 2 of
	out     43h, al                 ;   timer chip
	mov     dx, 12h                 ; Divide 1,193,180 hertz
	mov     ax, 34DCh               ;   (clock frequency) by
	mov     bx, BEEP_TONE           ;   desired frequency
	div     bx                      ; Result is timer clock count
	out     42h, al                 ; Low byte of count to timer
	mov     al, ah
	out     42h, al                 ; High byte of count to timer
	mov     bx,3                    ; Charge BX avec 3 BEEPs
main_b: in      al, 61h                 ; Read value from port 61h
	or      al, 3                   ; Set first two bits
	out     61h, al                 ; Turn speaker on
	mov     dx,3
rebou:  mov     cx, 0ffffh       
bou:    loopnz  bou
	dec     dx
	jnz     rebou
	in      al, 61h                 ; When time elapses, get port value
	xor     al, 3                   ; Kill bits 0-1 to turn
	out     61h, al                 ;   speaker off
	dec     cx
bou1:   loopnz  bou1
	dec     bx                      ; Compteur de boucle. 
	jnz     main_b                  ; Trois bips...
	
		
s:              mov     sp,word ptr cs:[_SAUVE_SP]
		popf    
		pop     dx
		pop     cx
		pop     bx
		pop     ds                      
		pop     ax
		jmp     dword ptr cs:data_9

int_entry       endp

;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------

init:                                   ; Décodage du texte.
		cld                     ; Pour incrémenter SI et DI.
		xor ax,ax
		mov si,offset chaine    ; pointe sur le début de la chaine.
		mov di,si               ; DI également.
		mov cx,offset chaine_fin - offset chaine

					; 28 lignes de 6 caractères sont XORés.
					; + mess_err ( 30 ) + nom_prog ( 13 ).
toto:           lodsb                   ; On cherche...
		xor al,ah               ; On XOR.
		stosb                   ; On remet.
		xchg ah,al
		loop toto               ; Et on tourne tant que CX # 0.

		mov ax,1a00h            ; Test si carte + moniteur VGA
		int 10h
		cmp al,1ah
		je  graf            ; Si oui on affiche la fenêtre FREDDY_SOFT.
suite1:         mov ah,4ah              
		mov bx,offset fin   ; Fin du programme en BX.
		mov cl,4            ; Divisé par 4 pour avoir des paragraphes.  
		shr bx,cl
		inc bx              ; On en rajoute un par sécurité.    
		int 21h             ; Execution de la fonction 4Ah.
		mov sp,offset fin   ; on déplace la pile en "fin" car elle est
		jmp loc_1           ; placée en FFFE dans un programme COM.

graf:           xor ah,ah       ; Raz de l'écran
		mov al,3
		int 10h
		mov ax,1301h        ; Mode 01 attribut couleur dans BL. 
		mov bx,004bh        ; Page 0.
		mov cx,28           ; nombre de char.
		mov dx,0a19h        ; ligne,colonne.
		lea bp,cs:[chaine]
ligne_suiv:     int 10h
		inc dh
		add bp,28
		cmp dh,10h              ; 6 lignes de 28 caractères.
		jb ligne_suiv 
		mov ah,2                ; Pour faire disparaitre le curseur.
		xor bh,bh               ; Page ecran 0.
		mov dh,25
		int 10h
		xor ah,ah
		int 16h                 ; Attends un char...
		jmp suite1
		db      55h,0aah        ; Identificateur de début.
chaine:         db      'ÚÄÄÄÄÄÄÄFREDDY_SOFT!ÄÄÄÄÄÄÄ¿'
		db      '³                          ³'
		db      '³   SEVEN  COLORS Bypass   ³'
		db      "³  I hope you'll enjoy it  ³"
		db      '³                          ³'
		db      'ÀÄÄ Lançeur Crypté V1.1 ÄÄÄÙ'
mess_err        db      0ah,0dh,'Programme enfant non trouvé','$'
nom_prg         db      'tatou.com',0,0,0,0   ; 12 car max + nul
chaine_fin:     db      0aah,55h        ; Identificateur de fin.
fin_init        label near

;----------------------- PLACE RESERVEE POUR LA PILE ------------------------

		dw 100 dup (' ')
fin             equ this byte       ; ici le sommet de la pile, SP.
seg_a           ends
		end     start


		Date		:	13 juillet 1992
		Protection	:	MOT DE PASSE
		Programme	:       7COLORS
		Outils		:	SOFT-ICE V2.50
		Fichier		:	Probablement COLORS.CC1
		Temps passé	:	20 MINUTES
		Société		:	INFOGRAMES
		Divers	        :	Chaine crypté, utilisation d'un lançeur
		Numéro		:	183	


	O— l'on tombe en moins de deux minutes sur le saut fatidique, mais
	ce dernier est crypté comme tous les fichiers d'INFOGRAMES.
	On trouve bien trois octets correspondant à la chaine seize fois de
	suite dans le fichier COLORS.CC1 mais il est plus rapide d'adapter
	l'un de mes lanceurs que de faire un patch seize fois de suite.
	De plus les octets en amont et en aval ne "collent" pas.

	Il est vrai que dans le fichier codé d'ETERNAM celà a fonctionné alors
	que la méthode du lançeur ne fonctionne pas du tout. ( salade faite
	avec SS:SP ) Dans le cas présent on quitte simplement la routine
	de demande du mot de passe par un RETF pour se retrouver dans le bon
	segment IP.
 
	On pourrait essayer la méthode suivante :

		- SAUVEGARDER le fichier COLORS.CC1.
	B:	- Chercher avec PCTOOLS la récurrence N de ( 7503E9 ).
		- Patcher avec 9090.
		- Sauver.
		- Essayer le jeu.
	        - Si OK ---> FIN	
		- Sinon recopier le fichier original sur le fichier modifié.
		- Incrémenter N
		- Si N = 16 ---> FIN
		- Sinon GOTO B
	FIN:    - Et il n'est pas évident que celà fonctionne !

	CS=19F0
	CS:B272 25FF00	AND	AX,00FF
	CS:B275	3946D4	CMP	[BP-2C],AX
	CS:B278 7503	JNZ	B27D	;	A NOPER ( 9090 )
	CS:B27A	E91E00	JMP	B29B
	CS:B27D	B80600	MOV	AX,0006
 
	Il est nécessaire de tester dans le lanceur le mot situé en B27A sous
	peine de déclencher le patch bien plus tot que prévu.

 ;       PATCH POUR LE PROGRAMME 7COLORS
 ;       DETOURNEMENT DE L'INT 1C
 ;
 ;*****************************************************************************
 ;                             ZONE A INITIALISER

 adr_ip1         equ     0b278h  ; adresse dont le contenu est à modifier.
				 ; Cette valeur est "directe"
 anc_val         equ     0375h   ; Valeur d'origine à rechercher.
				 ; Celle-ci doit être inversée ( HB avec LB )
 anc_val_plus2   equ     1ee9h   ; Mot suivant. ( inversé )
 nouv_val        equ     9090h   ; Nouvelle valeur.
				 ; Celle-ci doit être inversée ( HB avec LB )
 
 INT_DET         equ     1Ch     ; Le numéro de l'INT que l'on veut utiliser.
 BEEP_TONE       EQU     440     ; Beep tone in hertz
 BEEP_DURATION   EQU     0ffffh          
 ;CARTE_OUT_AL	equ	1	 ; Si 1 on assemble avec le test en IO 300h

 ;*****************************************************************************
 seg_a           segment byte public

		 assume  cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
		 .  
                 .
           commun à tous mes lançeurs...      
                 .
                 .  
		 org     100h
 sto             endp

 ;---------------------------- int détournée --------------------------------

 int_entry      proc    far
 _int:          jmp     _sp	; On contourne...
 _SAUVE_SP      dw      0,0	; SP est sauvé dans l'int dét.
 _sp:		push    ax
		push    ds
		push    bx
		push    cx
		push    dx
		pushf                           ; Push flags
 ifdef          CARTE_OUT_AL
		mov     dx,300h
		xor     al,al
	        out     dx,al			; Allume les 8 leds.
 else
		mov     dx,301h			; Test pour la carte PANO_AT
		out     dx,al			; RAZ du LS393.
 endif
		mov     word ptr cs:[_SAUVE_SP],sp
		mov     cx,25
 prochain:      pop     ds
		dec     cx
 ifdef		CARTE_OUT_AL
 else
		mov     dx,300h
		out     dx,al			; Compte le nombre de dépilage
						; de SP.
 endif
		jz      s                      
		cmp     word ptr ds:[adr_ip1],anc_val   ; Si ok on patche.
		jnz     prochain
	        cmp     word ptr ds:[adr_ip1+2],anc_val_plus2
		jnz     prochain
		mov     word ptr ds:[adr_ip1],nouv_val  ; On y place le patch.
		xor     bx,bx
		mov     ds,bx                   

	; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de
	; la fonction 25h ( set int. vector )   
	
		mov     bx,word ptr cs:data_9      ; Je remets manuellement
		mov     ds:[INT_DET*4],bx          ; en place le vecteur
		mov     bx,word ptr cs:data_9+2    ; de l'INT détournée.
		mov     ds:[INT_DET*4+2],bx        
 ifdef           CARTE_OUT_AL
		mov     dx,300h
		mov     al,0ffh			   ; Carte OUT_AL	
		out     dx,al			   ; Etteint les 8 leds.
 endif

 ;* Sound - Sounds speaker with the following tone and duration:
	.
	.
	.
	routine sonore commune...
	.
	.
	.
 s:              mov     sp,word ptr cs:[_SAUVE_SP]
		 popf    
		 pop     dx
		 pop     cx
		 pop     bx
		 pop     ds                      
		 pop     ax
  		 jmp     dword ptr cs:data_9

 int_entry       endp

 ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
 		 .
		 .
		 .
		 .
		 .
 mess_err        db      0ah,0dh,'Placez-moi dans le bon répertoire SVP...','$'
 nom_prg         db      'tatou.com',0,0,0,0   ; 12 car max + nul
 chaine_fin:     db      0aah,55h        ; Identificateur de fin.
 fin_init        label near

 ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
 		 dw 100 dup (' ')
 fin             equ this byte       ; ici le sommet de la pile, SP.
 seg_a           ends
  		 end     start

	FREDDY